{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "nW0GFyuPtUVO"
   },
   "source": [
    "# 数据预处理"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "分词器："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import nltk\n",
    "import string\n",
    "%matplotlib inline\n",
    "from nltk import word_tokenize\n",
    "import matplotlib.pyplot as plt\n",
    "from nltk.corpus import stopwords\n",
    "\n",
    "enstop = stopwords.words('english')\n",
    "punct = string.punctuation\n",
    "\n",
    "\n",
    "def tokenizer(sent):\n",
    "    sent = sent.lower()\n",
    "    tmp = word_tokenize(sent)\n",
    "    res = []\n",
    "    for word in tmp:\n",
    "        if word not in enstop and word not in punct:\n",
    "            res.append(word)\n",
    "    return res"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "IMDB数据："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "colab": {},
    "colab_type": "code",
    "id": "nynlluqzE_2N"
   },
   "outputs": [],
   "source": [
    "import torch\n",
    "import torch.nn as nn\n",
    "from torchtext import data\n",
    "from torchtext import vocab\n",
    "\n",
    "text_field = data.Field(tokenize=tokenizer, lower=True, include_lengths=True,\n",
    "                        fix_length=256)\n",
    "label_field = data.Field(sequential=False, use_vocab=False, dtype=torch.long)\n",
    "train, valid, test = data.TabularDataset.splits(path='',\n",
    "                                                train='Train.csv',\n",
    "                                                validation='Valid.csv',\n",
    "                                                test='Test.csv',\n",
    "                                                format='csv', skip_header=True,\n",
    "                                                fields=[('sentence', text_field), ('label', label_field)])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "读取GloVe词向量："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "colab": {},
    "colab_type": "code",
    "id": "BoI5yPFIVEUG"
   },
   "outputs": [],
   "source": [
    "vec = vocab.Vectors(name='glove.6B.300d.txt')\n",
    "text_field.build_vocab(train, valid, test, max_size=250000, vectors=vec,\n",
    "                       unk_init=torch.Tensor.normal_)\n",
    "label_field.build_vocab(train, valid, test)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "colab": {},
    "colab_type": "code",
    "id": "wzwZVu7EbZRY"
   },
   "outputs": [],
   "source": [
    "device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')\n",
    "train_iter, valid_iter, test_iter = data.BucketIterator.splits((train, valid, test), batch_sizes=(64, 64, 64),\n",
    "                                                               sort_key=lambda x: len(x.sentence),\n",
    "                                                               sort_within_batch=True,\n",
    "                                                               repeat=False, shuffle=True,\n",
    "                                                               device=device)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "OfDvZOj9w9_A"
   },
   "source": [
    "# 模型训练函数"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "colab": {},
    "colab_type": "code",
    "id": "C4eRtD_gxA3l"
   },
   "outputs": [],
   "source": [
    "def train_fun(model, train_iter, dev_iter, num_epoch, opt, criterion, eva,\n",
    "              out_model_file):\n",
    "    model.train()\n",
    "    loss_list = []\n",
    "    dev_acc = []\n",
    "    best_dev_acc = 0.\n",
    "    for epoch in range(num_epoch):\n",
    "        total_loss = 0.\n",
    "        for batch in train_iter:\n",
    "            output = model(batch.sentence)\n",
    "            loss = criterion(output, batch.label)\n",
    "            opt.zero_grad()\n",
    "            loss.backward()\n",
    "            opt.step()\n",
    "            total_loss += loss.item()\n",
    "        loss_list.append(total_loss)\n",
    "        dev_acc.append(eva(model, dev_iter))\n",
    "        print(f\"Epoch: {epoch + 1}/{num_epoch}. Total loss: {total_loss:.3f}. Validation Set Acc: {dev_acc[-1]:.3%}.\")\n",
    "        if dev_acc[-1] > best_dev_acc:\n",
    "            best_dev_acc = dev_acc[-1]\n",
    "            torch.save(model.state_dict(), out_model_file)\n",
    "    return loss_list, dev_acc"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "5dY4gBmd3Xuv"
   },
   "source": [
    "# 模型评价函数"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "colab": {},
    "colab_type": "code",
    "id": "2lSdhhl03Zav"
   },
   "outputs": [],
   "source": [
    "def eva(model, data_iter):\n",
    "    correct, count = 0, 0\n",
    "    with torch.no_grad():\n",
    "        for batch in data_iter:\n",
    "            pred = model(batch.sentence)\n",
    "            pred = torch.argmax(pred, dim=-1)\n",
    "            correct += (pred == batch.label).sum().item()\n",
    "            count += len(pred)\n",
    "    return correct / count"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "lV8xCDOVE-yR"
   },
   "source": [
    "# TextCNN"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "colab": {},
    "colab_type": "code",
    "id": "LAm4aeKqS6CZ"
   },
   "outputs": [],
   "source": [
    "class CNN(nn.Module):\n",
    "    def __init__(self, in_channels, out_channels, filter_list):\n",
    "        super(CNN, self).__init__()\n",
    "        self.convs = nn.ModuleList([\n",
    "            nn.Conv1d(in_channels, out_channels, kernel_size=fs)\n",
    "            for fs in filter_list\n",
    "        ])\n",
    "        self.relu = nn.ReLU()\n",
    "        self.init_params()\n",
    "\n",
    "    def forward(self, x):\n",
    "        return [self.relu(conv(x)) for conv in self.convs]\n",
    "\n",
    "    def init_params(self):\n",
    "        for m in self.convs:\n",
    "            nn.init.kaiming_normal_(m.weight.data)\n",
    "            nn.init.constant_(m.bias.data, 0)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {
    "colab": {},
    "colab_type": "code",
    "id": "qpf1UZNmFCXV"
   },
   "outputs": [],
   "source": [
    "class TextCNN(nn.Module):\n",
    "    def __init__(self, embed_dim, pretrained_embed, filter_size, filter_channels,\n",
    "                 out_dim, dropout_rate=0.1, vocab_size=None, freeze=True,\n",
    "                 random_embed=False):\n",
    "        super(TextCNN, self).__init__()\n",
    "        if random_embed:\n",
    "            self.embed = nn.Embedding(vocab_size, embed_dim)\n",
    "        else:\n",
    "            self.embed = nn.Embedding.from_pretrained(pretrained_embed, freeze=freeze)\n",
    "        self.cnn = CNN(embed_dim, filter_channels, filter_size)\n",
    "        self.proj = nn.Linear(len(filter_size) * filter_channels, out_dim)\n",
    "        self.dropout = nn.Dropout(p=dropout_rate)\n",
    "        self.init_params()\n",
    "\n",
    "    def init_params(self):\n",
    "        nn.init.xavier_normal_(self.proj.weight.data)\n",
    "        nn.init.constant_(self.proj.bias.data, 0)\n",
    "\n",
    "    def forward(self, x):\n",
    "        text, _ = x\n",
    "        text = text.permute(1, 0)  # [bs, seq_len]\n",
    "        out = self.embed(text)  # [bs, seq, emb]\n",
    "        out = out.permute(0, 2, 1)  # [bs, emb, seq]\n",
    "        out = self.cnn(out)  # [nf, bs, fc, -1]\n",
    "        out = [torch.max_pool1d(x, x.shape[-1]).squeeze(2) for x in out]  # [nf, bs, fc]\n",
    "        out = self.dropout(torch.cat(out, dim=1))\n",
    "        return self.proj(out)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 随机词向量"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Training begin!\n",
      "Epoch: 1/20. Total loss: 527.836. Validation Set Acc: 80.620%.\n",
      "Epoch: 2/20. Total loss: 196.136. Validation Set Acc: 82.700%.\n",
      "Epoch: 3/20. Total loss: 138.003. Validation Set Acc: 85.780%.\n",
      "Epoch: 4/20. Total loss: 107.602. Validation Set Acc: 84.800%.\n",
      "Epoch: 5/20. Total loss: 82.596. Validation Set Acc: 85.880%.\n",
      "Epoch: 6/20. Total loss: 80.455. Validation Set Acc: 87.080%.\n",
      "Epoch: 7/20. Total loss: 70.455. Validation Set Acc: 86.900%.\n",
      "Epoch: 8/20. Total loss: 78.818. Validation Set Acc: 86.420%.\n",
      "Epoch: 9/20. Total loss: 68.304. Validation Set Acc: 87.360%.\n",
      "Epoch: 10/20. Total loss: 66.353. Validation Set Acc: 87.500%.\n",
      "Epoch: 11/20. Total loss: 61.256. Validation Set Acc: 86.580%.\n",
      "Epoch: 12/20. Total loss: 60.813. Validation Set Acc: 87.220%.\n",
      "Epoch: 13/20. Total loss: 97.230. Validation Set Acc: 87.320%.\n",
      "Epoch: 14/20. Total loss: 59.103. Validation Set Acc: 87.740%.\n",
      "Epoch: 15/20. Total loss: 45.020. Validation Set Acc: 85.960%.\n",
      "Epoch: 16/20. Total loss: 55.311. Validation Set Acc: 87.880%.\n",
      "Epoch: 17/20. Total loss: 50.817. Validation Set Acc: 87.020%.\n",
      "Epoch: 18/20. Total loss: 60.631. Validation Set Acc: 87.120%.\n",
      "Epoch: 19/20. Total loss: 68.023. Validation Set Acc: 87.080%.\n",
      "Epoch: 20/20. Total loss: 42.953. Validation Set Acc: 87.660%.\n"
     ]
    }
   ],
   "source": [
    "embed_dim = 300\n",
    "pretrained_embed = text_field.vocab.vectors\n",
    "filter_size = [1, 2, 3, 4, 5]\n",
    "filter_channels = 300\n",
    "freeze = False\n",
    "vocab_size = len(text_field.vocab.stoi)\n",
    "random_embed = True\n",
    "out_dim = 2\n",
    "dropout_rate = 0.2\n",
    "num_epoch = 20\n",
    "lr = 0.001\n",
    "out_model_file = 'textcnn_random.pt'\n",
    "\n",
    "print(f\"Training begin!\")\n",
    "textcnn_random = TextCNN(embed_dim, pretrained_embed, filter_size, filter_channels,\n",
    "                         out_dim, dropout_rate, freeze=freeze, random_embed=random_embed,\n",
    "                         vocab_size=vocab_size).to(device)\n",
    "opt = torch.optim.Adam(textcnn_random.parameters(), lr=lr)\n",
    "criterion = nn.CrossEntropyLoss()\n",
    "\n",
    "loss_list, dev_acc_list = train_fun(textcnn_random, train_iter, valid_iter, num_epoch, opt, criterion, eva,\n",
    "                                    out_model_file)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 1080x360 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.figure(figsize=(15, 5))\n",
    "plt.plot(loss_list, marker='s')\n",
    "plt.xlabel('epoch')\n",
    "plt.ylabel('total loss')\n",
    "plt.title('Total loss per epoch')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 1080x360 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.figure(figsize=(15, 5))\n",
    "plt.plot(dev_acc_list, marker='s')\n",
    "plt.xlabel('epoch')\n",
    "plt.ylabel('dev acc')\n",
    "plt.title('Validation set accuracy')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Test set acc: 87.66%\n"
     ]
    }
   ],
   "source": [
    "textcnn_random = TextCNN(embed_dim, pretrained_embed, filter_size, filter_channels,\n",
    "                         out_dim, dropout_rate, freeze=freeze, random_embed=random_embed,\n",
    "                         vocab_size=vocab_size).to(device)\n",
    "textcnn_random.load_state_dict(torch.load('textcnn_random.pt'))\n",
    "print(f\"Test set acc: {eva(textcnn_random, test_iter):.2%}\")"
   ]
  }
 ],
 "metadata": {
  "accelerator": "GPU",
  "colab": {
   "collapsed_sections": [],
   "name": "文本分类项目.ipynb",
   "provenance": [],
   "toc_visible": true
  },
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.8.1"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 1
}
